package com.seed.bpmn.engine;

import com.seed.bpmn.engine.dto.*;

import java.util.List;
import java.util.Map;

/**
 * 流程流转时相关服务接口
 * @author cscz89@126.com
 */
public interface IBPMNRuntimeService {

    /**
     * 流程启动
     * @param processDefinitionId 流程定义（模版）id
     * @param businessKey 业务数据ID
     * @param userId 流程启动人
     * @param variables 流程启动参数
     * @param autoDraft 是否自动完成任务
     * @return
     * @throws Exception
     */
    public ProcessInstanceStartDTO start(String processDefinitionId, String businessKey, String userId, Map<String, Object> variables, boolean autoDraft) throws Exception;

    /**
     * 流程任务处理方法
     * @param taskId 任务id
     * @param userId 任务处理人
     * @param candidates 下一环节处理人
     * @param flows 流转线选择情况
     * @param suggestion 处理意见
     * @return
     * @throws Exception
     */
    public List<TaskEntityDTO> complete(String taskId, String userId, List<String> candidates, Map<String, Boolean> flows, String suggestion) throws Exception;

    /**
     * 流程任务处理方法
     * @param taskId 任务id
     * @param userId 任务处理人
     * @param variables 流程提交参数
     * @param localScope
     * @return
     * @throws Exception
     */
    public List<TaskEntityDTO> complete(String taskId, String userId, Map<String, Object> variables, boolean localScope) throws Exception;

    /**
     * 签收任务
     * @param taskId 任务id
     * @param userId 签收人
     * @param sign 处理方式：ture签收、false取消签收
     * @throws Exception
     */
    public boolean sign(String taskId, String userId, boolean sign) throws Exception;

    /**
     * 查询流程实例当前所有待办任务（不包括传阅任务）
     * @param processInstanceId 流程实例id
     * @return
     * @throws Exception
     */
    public List<TaskDTO> findTaskByProcessInstanceId(String processInstanceId) throws Exception;

    /**
     * 通过流程实例id与当前登录人查询运行任务时的任务
     * @param processInstanceId 流程实例id
     * @param userId 处理人
     * @return
     * @throws Exception
     */
    public List<TaskDTO> findTaskByProcessInstanceId(String processInstanceId, String userId) throws Exception;

    /**
     * 流转意见保存方法
     * @param taskId 任务id
     * @param userId 处理人
     * @param processInstanceId 流程实例id
     * @param suggestion 处理意见
     * @throws Exception
     */
    public CommentDTO addComment(String taskId, String userId, String processInstanceId, String suggestion) throws Exception;


    /**
     * 流程调度
     * @param processInstanceId 流程实例id
     * @param nodeId 调度目标环节ID
     * @param candidates 下一处理人
     * @param reason 原因
     * @throws Exception
     */
    public ScheduleDTO scheduleProcess(String processInstanceId, String nodeId, List<String> candidates, String reason) throws Exception;

    /**
     * 通过流程实例Id 删除流程定义
     * @param processInstanceId
     * @param reason
     * @return
     */
    boolean deleteProcessByInstanceId(String processInstanceId, String reason)throws Exception;
}
